package main

import "fmt"

func main() {
	m := map[string]string{
		"name":    "alex",
		"course":  "golang",
		"site":    "imooc",
		"quality": "good",
	}

	m2 := make(map[string]int) /// m2 = empty map

	var m3 map[string]int // m3 == nil

	//map[K]V,  map[K1]map[K2]v
	fmt.Println(m, m2, m3) // map[course:golang name:alex quality:good site:imooc]  map[] map[]

	fmt.Println("Traversing map")

	for k, v := range m {
		fmt.Println(k, v)
	}
	fmt.Println("===========")
	fmt.Println("Getting values")
	courseName, ok := m["course"]
	fmt.Println(courseName, ok)
	if causeName, ok := m["cause"]; ok {
		fmt.Println(causeName, ok)
	} else {
		fmt.Println("key does not exist")
	}
	fmt.Println("------------")
	fmt.Println("Deleting values")
	name, ok := m["name"]
	fmt.Println(name, ok)

	delete(m, "name")
	if name, ok = m["name"]; ok {
		fmt.Println(name, ok)
	} else {
		fmt.Println("key isn't exist!!!!!")
	}
	// 使用range 遍历key, 或者遍历 key , value 对
	// 不保证遍历顺序， 如需顺序，需要手动对key排序
	// 使用len获得元素个数

	// map 的 kep
	// map使用哈希表， 必须可以比较相等
	// 出了 slice, map, function的内键类型都可以作为key
	// struct类型不包含上述字段，也可以作为key
}
